package juc2.base;

/**
 * 线程终止案例
 */
public class threadStop {
    // 自定义标志位（需用volatile保证可见性）
   static volatile boolean isStop = false;
    /**
     * 方案二：使用volatile变量isStop标记线程是否终止
     */
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            // 循环执行任务，通过中断标记判断是否退出
            while (!isStop) {//如果不是终止状态进入循环继续执行
                System.out.println("子线程执行任务中...");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println("子线程抛出InterruptedException异常：" + e);
                    e.printStackTrace();
                }
            }
            System.out.println("线程已终止");
        });
        thread.start();
        // 主线程随眠3秒以便子线程执行，发送中断信号
        Thread.sleep(3000);
        //在主线程中设置终止标记
        System.out.println("设置终止标记:" + isStop);
        isStop = true;
    }

    /**
     * 方案一：使用中断方法中断线程
     */
 /*   public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            // 循环执行任务，通过中断标记判断是否退出
            //Thread.currentThread().isInterrupted() 用于检查当前线程是否被设置为中断状态。
            while (!Thread.currentThread().isInterrupted()) {//如果不是终止状态进入循环继续执行
                try {
                    System.out.println("子线程执行任务中...");
                    Thread.sleep(1000); // 若在休眠中被中断，会抛出InterruptedException
                } catch (InterruptedException e) {
                    // 捕获中断异常后，需手动设置中断标记（因为异常会清除标记）
                    System.out.println("子线程抛出InterruptedException异常："+ e);
                    Thread.currentThread().interrupt();
                    break; // 退出循环，终止线程
                }
            }
            System.out.println("线程已终止");
        });

        thread.start();

        // 主线程随眠3秒以便子线程执行，发送中断信号
        Thread.sleep(3000);
        //在主线程中中断子线程thread
        thread.interrupt();
    }*/

}
